package com.neusoft.db;

import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.neusoft.MyUtils.MyUtil;
import com.neusoft.bean.EmpBean;

public class DBDataSource {
	// 数据源对象--静态实例变量
	private static DataSource dataSource;

	// 将构造方法私有化 -- 禁止类的外部创建该类的实例对象
	private DBDataSource() {
	}

	/**
	 * 获取数据源对象
	 * 
	 * @return 数据源对象
	 */
	public static DataSource getDataSourceInstance() {
		// 判定静态实例变量是否已经进行初始化（第一次访问需要进行初始化）
		if (dataSource == null) {
			// 初始化处理
			try {
				// 使用工具类 Properties读取配置文件的内容
				Properties prop = new Properties();
				// 工具类Properties加载配置文件内容：要求 db.properties 文件必须放在src根目录下，不能放到包中
				// 将配置文件内容读取为输入流对象
				InputStream is = DBDataSource.class.getClassLoader().getResourceAsStream("db.properties");
				// 将配置文件的输入流内容加载到Properties类的实力变量 prop 中
				prop.load(is);
				// 初始化数据源对象：使用dbcp2的BasicDataSourceFactory类的createDataSource工厂方法获取数据源对象
				dataSource = BasicDataSourceFactory.createDataSource(prop);
			} catch (Exception e) {
				// 数据源初始化异常
				MyUtil.logRootLogger.debug("数据源初始化异常：");
				e.printStackTrace();
			}
		}
		return dataSource;
	}

	public static void main(String[] args) {
		try {
			String sql = "SELECT * FROM emp";
			// 使用dbutils查询数据库
			// 创建一个查询执行器对象 queryrunner--相当于是statement
			QueryRunner qr = new QueryRunner(getDataSourceInstance());
			// 进行查询操作
			List<EmpBean> lstAdmins = qr.query(sql, new BeanListHandler<>(EmpBean.class));
			// 遍历结果集，将查询结果进行显示
			for (EmpBean adminBean : lstAdmins) {
				System.out.println(adminBean.toString());
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
